package jee.boot.common.standard;

import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 文件服务接口
 */
public interface DocumentStorageClient {
    /**
     * 上传形式的文件上传
     *
     * @param file 上传形式的文件
     * @return SysAttachment对象, 包含附件id, fileName等信息
     */
    <T> T uploadFromMultipartFile(MultipartFile file);

    /**
     * 上传形式的文件上传
     *
     * @param file         上传形式的文件
     * @param businessId   业务ID
     * @param businessType 业务类型
     * @return SysAttachment对象, 包含附件id, fileName等信息
     */
    default <T> T uploadFromMultipartFile(MultipartFile file, String businessId, String businessType) {
        return null;
    }

    /**
     * 输入流上传至文件服务器
     *
     * @param inputStream 输入数据流
     * @param fileName    文件名
     * @return @return SysAttachment对象,包含附件id,fileName等信息
     */
    <T> T uploadFromInputStream(InputStream inputStream, String fileName);

    /**
     * 上传形式的文件上传
     *
     * @param inputStream  输入数据流
     * @param businessId   业务ID
     * @param businessType 业务类型
     * @return SysAttachment对象, 包含附件id, fileName等信息
     */
    default <T> T uploadFromInputStream(InputStream inputStream, String fileName, String businessId, String businessType, long fileSize) {
        return null;
    }

    /**
     * 文件上传至文件服务器
     *
     * @param file 临时文件
     * @return @return SysAttachment对象,包含附件id,fileName等信息
     */
    <T> T uploadFromFile(File file);

    /**
     * 从文件服务器下载一个文件
     *
     * @param attachmentId 附件ID
     * @return 文件
     */
    File downloadToFile(String attachmentId) throws FileNotFoundException;

    /**
     * 从文件服务器下载一个文件到输出流
     *
     * @param attachmentId 附件ID
     * @return 文件流
     */
    OutputStream downloadToOutputStream(String attachmentId) throws FileNotFoundException;

    /**
     * 从文件服务器下载一个文件到输出流
     *
     * @param attachmentId 附件ID
     * @return 文件流
     */
    default void downloadToOutputStream(String attachmentId, HttpServletResponse response) throws FileNotFoundException {

    }

    /**
     * 删除文件
     *
     * @param attachmentId 附件ID
     */
    void deleteFile(String attachmentId) throws FileNotFoundException;
}
